package com.zhangye.test.api;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.zhangye.test.model.Test;
import com.zhangye.test.service.TestService;


/**
 * 上传excel
 * 作者： 张叶
 * 创建时间：2018年11月13日  上午11:49:00
 */
@Controller
@RequestMapping(value = "api/import")
public class ImportApi {

	protected Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private TestService testService;


	/**
	 * 导入数据
	 * 作者： 张叶
	 * 创建时间：2018年11月13日  上午11:48:53
	 */
	@ResponseBody
	@RequestMapping(value = "/import", method = RequestMethod.POST)
	public ApiResult importTestData(@RequestParam(value = "file", required = false) MultipartFile file
			) throws Exception {
		ApiResult result = new ApiResult();
		final InputStream inputStream = file.getInputStream();
		// 导入数据
        if (file.getOriginalFilename().toLowerCase().endsWith(".xlsx")) {
    		List<Test> results = importTestData(inputStream);
    		if(results.size() > 0){
				result.msg.status = 1;
				result.msg.desc = "上传失败";
    		}else{
				result.msg.status = 0;
				result.msg.desc = "上传成功";
    		}
        }else{
			result.msg.status = 3;
			result.msg.desc = "参数格式不正确";
        }
		
		return result;
	}

	/**
	 * 上传excel 
	 * 作者： 张叶 
	 * 创建时间：2017年5月3日 下午5:06:58
	 */
	public List<Test> importTestData(InputStream xlsInputStream)
			throws Exception {
		List<Test> dataList = new ArrayList<>();
		List<Test> result = new ArrayList<>();
		// 解析数据
		XSSFWorkbook xssfWorkbook = new XSSFWorkbook(xlsInputStream);
		for (int i = 0; i < xssfWorkbook.getNumberOfSheets(); i++) {
			XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
			dataList.addAll(getDataList(sheet));
		}
		for (Test member : dataList) {
				testService.insert(member);
				// 更新业务表
		}
		return result;
	}

	/**
	 * 解析数据 
	 * 作者： 张叶 
	 * 创建时间：2017年5月3日 下午5:15:34
	 */
	private List<Test> getDataList(XSSFSheet sheet) throws Exception {
		if (sheet.getLastRowNum() < 2) {
			return new ArrayList<>();
		}
		List<Test> memberList = new ArrayList<>();
		for (int i = 2; i <= sheet.getLastRowNum(); i++) {
			try {
				XSSFRow row = sheet.getRow(i);
				if (row == null){
					continue;
				}
				memberList.add(processRow(row));
			} catch (Exception e) {
				logger.error(ExceptionUtils.getStackTrace(e));
			}
		}
		return memberList;
	}

	/**
	 * excel行转为member实体 
	 * 作者： 张叶 
	 * 创建时间：2017年5月3日 下午5:23:00
	 */
	private Test processRow(XSSFRow row) {
		Test member = new Test();
		int j = 0;
		member.setName(getValue(row.getCell(j++)));// 姓名
		member.setAddress(getValue(row.getCell(j++))); // 地址
		member.setTelphone(getValue(row.getCell(j++))); // 账号
		member.setLat(getValue(row.getCell(j++))); // 账号
		member.setLng(getValue(row.getCell(j++))); // 账号
		return member;
	}

	/**
	 * excel行转实体时，每一列的字符转化 作者： 张叶 创建时间：2017年5月3日 下午5:28:52
	 */
	private String getValue(XSSFCell cell) {
		if (cell == null) {
			return null;
		}
		if (cell.getCellType() == cell.CELL_TYPE_BOOLEAN) {
			return String.valueOf(cell.getBooleanCellValue());
		} else if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {
			String val = String.valueOf(cell.getNumericCellValue());
			if (val.endsWith(".0")) {// 数字类型忽略小数
				return val.substring(0, val.length() - 2);
			}
			return val;
		} else {
			return String.valueOf(cell.getStringCellValue());
		}
	}

}
